#include <argp.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <syslog.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/resource.h>
#include "dirtypipe_detection_event.h"
#include "dirtypipe_detection.skel.h"

/****************************************************/
/*!
 *  \brief  Use to maintain state when the program 
 *          is use in interactive mode
 */
static volatile sig_atomic_t exiting;

/****************************************************/
/*!
 *  \brief  Signal hanlder
 */
void sig_int(int signo){
  exiting = 1;
}

/****************************************************/
/*!
 *  \brief  Display LibBPF logs
 */
static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args){
  return vfprintf(stderr, format, args);
}

/****************************************************/
/*!
 *  \brief  Handle tracepoint events in normal mode (interactive)
 */
static int handle_event(void *ctx, void *data, size_t data_sz){
  event_t *e = data;
  printf("%-15lu | %-15u | %-15u | %-15s | %s\n", e->time, e->uid, e->pid, e->process, e->target);
  return 0;
}

/****************************************************/
/*!
 *  \brief  Handle tracepoint events in daemon mode
 *          In daemon mode we use syslog as output
 */
static int handle_event_dmn(void *ctx, void *data, size_t data_sz){
  event_t *e = data;
  syslog(LOG_ALERT, "%lu / %u / %u / %s / %s", e->time, e->uid, e->pid, e->process, e->target);
  return 0;
}

/****************************************************/
/*!
 *  \brief  Continue the program as a daemon
 */
static void start_daemon(void){
  pid_t child = fork();
  if (child < 0) exit(child);
  if (child > 0) exit(0);

  setsid();

  child = fork();
  if (child < 0) exit(child);
  if (child > 0) exit(0);

  umask(0);

  close(0);
  close(1);
  close(2);

  int fd_0 = open("/dev/null", O_RDWR);
  if (fd_0 != 0) exit(1);
  int fd_1 = dup(fd_0);
  if (fd_1 != 1) exit(1);
  int fd_2 = dup(fd_0);
  if (fd_2 != 2) exit(1);
}

/****************************************************/
int main(int argc, char *argv[]){
  struct ring_buffer *rb = NULL;
  struct dirtypipe_detection_bpf *skel;
  int err;

  char dmn_flag[] = "--daemon";
  char dbg_flag[] = "--debug";
  char hlp_flag[] = "--help";
  int dmn_mode    = 0;
  int dbg_mode    = 0;

  // Parse arguments
  if(argc>1){
    for(int i=1;i<argc;i++){
      if(strncmp(argv[i], dmn_flag, sizeof(dmn_flag)) == 0) dmn_mode = 1;
      if(strncmp(argv[i], dbg_flag, sizeof(dbg_flag)) == 0) dbg_mode = 1;
      if(strncmp(argv[i], hlp_flag, sizeof(hlp_flag)) == 0){
        printf("Usage: ./dirtypipe_detection [OPTION]...\n");
        printf("an eBPF detection program for CVE-2022-0847.\n");
        printf("      --help             display this help and exit\n");
        printf("      --debug            show libbpf logs on execution\n");
        printf("      --daemon           run program as daemon and send alerts\n");
        printf("                         over syslog\n\n");
        exit(0);
      }
    }
  }

  // LibBPF logs
  if(dbg_mode == 1) libbpf_set_print(libbpf_print_fn);

  struct rlimit rlim = {
        .rlim_cur    = RLIM_INFINITY,
        .rlim_max    = RLIM_INFINITY,
  };
  setrlimit(RLIMIT_MEMLOCK, &rlim);
  
  signal(SIGINT, sig_int);
  signal(SIGTERM, sig_int);

  // Open BPF application
  skel = dirtypipe_detection_bpf__open();
  if (!skel){
    fprintf(stderr, "Failed to open BPF program: %s\n", strerror(errno));
    return 1;
  }

  // Attach tracepoint handler
  err = dirtypipe_detection_bpf__load(skel);
  if (err){
    fprintf(stderr, "Failed to load BPF program: %s\n", strerror(errno));
    goto cleanup;
  }

  // Attach tracepoint handler
  err = dirtypipe_detection_bpf__attach(skel);
  if (err){
    fprintf(stderr, "Failed to attach BPF program: %s\n", strerror(errno));
    goto cleanup;
  }

  // Set up ring buffer
  if(dmn_mode == 1){
    rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event_dmn, NULL, NULL);
  }
  else{
    rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL);
  }
  if (!rb){
    err = -1;
    fprintf(stderr, "Failed to create ring buffer\n");
    goto cleanup;
  }

  // Display user readable events
  if(dmn_mode == 0){
    printf("\n\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[48;5;255m\e[38;5;26m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[48;5;255m\e[38;5;26m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;255m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;255m\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;26m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;26m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[48;5;255m\e[38;5;255m▄\e[38;5;255m▄\e[38;5;255m▄\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\e[48;5;26m\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[38;5;26m▄\e[0m\n\n");
    printf("\e[1mAn eBPF detection tool for CVE-2022-0847 detection.\e[0m\n\n");
    printf("%-15s | %-15s | %-15s | %-15s | %s\n", "TIME", "UID", "PID", "PROCESS", "TARGET");
    printf("%-15s | %-15s | %-15s | %-15s | %s\n", "-", "-", "-", "-", "-");
  }

  // Daemon mode
  if(dmn_mode == 1){
    start_daemon();
    openlog("dirtypipe_detection", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_DAEMON);
    syslog(LOG_INFO, "Dirty Pipe detection started!");
  }

  while (!exiting){
    err = ring_buffer__poll(rb, 100);
    if (err == -EINTR){
      err = 0;
      break;
    }
    if (err < 0){
      printf("Error polling perf buffer: %d\n", err);
      break;
    }
  }

cleanup:
  if(dmn_mode == 1){
    syslog(LOG_INFO, "Dirty Pipe detection stopped...");
    closelog();
  }
  dirtypipe_detection_bpf__destroy(skel);
  return -err;
}
